package com.xmindguoguo.boot.core.shiro;

import java.io.Serializable;
import java.util.Date;

import org.apache.shiro.session.Session;
import org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO;

import com.xmindguoguo.boot.modular.monitor.model.TSystemSessionModel;
import com.xmindguoguo.boot.modular.monitor.service.ITSystemSessionService;
import com.xmindguoguo.boot.util.ConvertUtil;
import com.xmindguoguo.boot.util.SerializeUtils;

public class DBSessionDao extends EnterpriseCacheSessionDAO {
    ITSystemSessionService systemSessionService;

    public void setSystemSessionService(ITSystemSessionService systemSessionService) {
        this.systemSessionService = systemSessionService;
    }

    /**
     * 创建session 并保存到数据库中
     * 
     * @Title doCreate
     * @author 于国帅
     * @date 2019年2月27日 上午11:09:11
     * @param session
     * @return
     * @see org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO#doCreate(org.apache.shiro.session.Session)
     */
    @Override
    protected Serializable doCreate(Session session) {
        Serializable sessionId = super.doCreate(session); //
        // 保存session 到数据库
        TSystemSessionModel model = new TSystemSessionModel();
        model.setSessionId(ConvertUtil.objToString(sessionId));
        model.setSessionStr(SerializeUtils.serializeString(session));
        model.setCreateTime(new Date());
        systemSessionService.insert(model);
        return sessionId;
    }

    /**
     * 读取session
     * 
     * @Title doReadSession
     * @author 于国帅
     * @date 2019年2月27日 上午11:09:35
     * @param sessionId
     * @return
     * @see org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO#doReadSession(java.io.Serializable)
     */
    @Override
    protected Session doReadSession(Serializable sessionId) {
        Session session = super.doReadSession(sessionId);
        if (session == null) {
            TSystemSessionModel userSession = systemSessionService.selectById(sessionId);
            if (userSession != null) {
                session = (Session) SerializeUtils.deserialize(userSession.getUserAgentStr());
                // 如果库有，缓存却没有，加入缓存，readsession调用次数太多
                // super.doCreate(session);虽然可以加入缓存，但错误的 会产生新的seesionid
//                cache(session, sessionId);
            }
        }
        return session;
    }

    // 更新session .shiro对每一次请求都会更新最后访问时间.当一个页面包含多个资源的时候就会发生多次update session
    @Override
    protected void doUpdate(Session session) {
        super.doUpdate(session);
        TSystemSessionModel userSession = new TSystemSessionModel();
        userSession.setSessionId(ConvertUtil.objToString(session.getId()));
        userSession.setSessionStr(SerializeUtils.serializeString(session));
        // getSecurityManager()是ShiroUtils.getUser()底层的方法，未登录的情况下SecurityManager不存在，就报错
//        if (ThreadContext.getSecurityManager() != null && ShiroKit.getUser() != null) {
//            userSession.setAccount(ShiroKit.getUserAccount());
//        }
        systemSessionService.updateById(userSession);
    }

    // 删除session
    @Override
    protected void doDelete(Session session) {
        super.doDelete(session);
        systemSessionService.deleteById(ConvertUtil.objToString(session.getId()));
    }
}
